package com.luxsoft.siipap.pos.ui.utils;

import java.awt.Dimension;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperPrintManager;
import net.sf.jasperreports.engine.data.JRTableModelDataSource;
import net.sf.jasperreports.view.JRViewer;

import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.util.Assert;

import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.GlazedLists;
import ca.odell.glazedlists.gui.TableFormat;
import ca.odell.glazedlists.swing.EventTableModel;

import com.jgoodies.uif.util.ScreenUtils;
import com.luxsoft.siipap.model.CantidadMonetaria;
import com.luxsoft.siipap.swing.utils.MessageUtils;
import com.luxsoft.siipap.util.MonedasUtils;
import com.luxsoft.siipap.ventas.model.Venta.TipoDeVenta;
import com.luxsoft.sw3.cfd.ReportDialog;
import com.luxsoft.sw3.cfd.model.ComprobanteFiscal;
import com.luxsoft.sw3.cfdi.CFDIValidaciones;
import com.luxsoft.sw3.gasoc.model.Factura;
import com.luxsoft.sw3.services.Services;
import com.luxsoft.sw3.services.VentasManager;

public class FacturaUtils {
	
	public static void imprimirFactura(Long id,boolean printPreview){
		Factura factura=Services.getInstance().getVentasManager().getFactura(id);
		imprimirFactura(factura, true);
	}
	
	public static void imprimirFactura(Factura fac,boolean printPreview){
		ComprobanteFiscal cfdi=Services.getInstance().getCFDManager().cargarComprobante(fac);
		
		if(cfdi!=null){
			JasperPrint jasperPrint=Services.getInstance().getCFDIPrintServices().impripirComprobante(cfdi);
			JRViewer jasperViewer = new JRViewer(jasperPrint);
			jasperViewer.setPreferredSize(new Dimension(900, 1000));
			ReportDialog dialog=new ReportDialog(jasperViewer,"Factura digital",false);
			ScreenUtils.locateOnScreenCenter(dialog);
			dialog.open();
			return;
		}
		Factura factura=Services.getInstance().getVentasManager().getFactura(fac.getId());
		if(factura!=null){
			final EventList<Factura.FacturaConcepto> conceptos=GlazedLists.eventList(factura.getConceptos());
			if(fac.getTipo().equals(VentasManager.TIPO_VENTA_GENERAL_DIARIA)){
				conceptos.clear();
				Factura.FacturaConcepto con=new Factura.FacturaConcepto(
						1d
						,""
						,""
						,"Facturacion general del dia"
						,fac.getImporte().doubleValue()
						,fac.getImporte().doubleValue()
						,""
						,""
						);
				conceptos.add(con);
			}else if(fac.getTipo().equals(TipoDeVenta.CAFE.name())){
				conceptos.clear();
				Factura.FacturaConcepto con=new Factura.FacturaConcepto(
						1d
						,""
						,""
						,"Consumo de alimentos y bebidas"
						,fac.getImporte().doubleValue()
						,fac.getImporte().doubleValue()
						,""
						,""
						);
				conceptos.add(con);
			}
			Map parametros=resolverParametros(factura);
			//parametros.put("DESTINATARIO", destinatario);
			JasperPrint jasperPrint = null;
			DefaultResourceLoader loader = new DefaultResourceLoader();
			String ruta="file:z:/Reportes_GASOC/ventas/FacturaDigital.jasper";
			Resource res = loader.getResource(ruta);
			Assert.isTrue(res.exists(),"No localizo el reporte: "+ruta);
			System.out.println("Generando impresion de Factura con parametros: "+parametros);
			try {
				java.io.InputStream io = res.getInputStream();
				String[] columnas= {
						"cantidad"
						,"clave"
						,"socio"
						,"descripcion"
						,"precio"
						,"importe"
						,"comentario1"
						,"comentario2"
						};
				String[] etiquetas={
						"CANTIDAD"
						,"CLAVE"
						,"SOCIO"
						,"DESCRIPCION"
						,"PRECIO"
						,"IMPORTE"
						,"COMENTARIO1"
						,"COMENTARIO2"
						};
				final TableFormat tf=GlazedLists.tableFormat(columnas, etiquetas);
				final EventTableModel tableModel=new EventTableModel(conceptos,tf);
				final JRTableModelDataSource tmDataSource=new JRTableModelDataSource(tableModel);
				jasperPrint = JasperFillManager.fillReport(io, parametros,tmDataSource);
				if(printPreview){
					JRViewer jasperViewer = new JRViewer(jasperPrint);
					jasperViewer.setPreferredSize(new Dimension(900, 1000));
					ReportDialog dialog=new ReportDialog(jasperViewer,"Factura ",false);
					ScreenUtils.locateOnScreenCenter(dialog);
					dialog.open();
				}else{
					JasperPrintManager.printReport(jasperPrint, false);
				}
				
			} catch (Exception ioe) {
				ioe.printStackTrace();
				MessageUtils.showError("Error imprimiendo CFD", ioe);
				return;
			}
			
			
		}
	}
	
	public static Map resolverParametros(Factura factura){		
		Map<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("SERIE", 			factura.getSerie());
		parametros.put("ANO_APROBACION",	factura.getAnoAprobacion());
		parametros.put("NO_APROBACION",		factura.getNoAprobacion());
		parametros.put("ASIGNACION",		factura.getAsignacion());
		parametros.put("DOCTO", 			factura.getFolio());
		parametros.put("NOMBRE", 			factura.getNombre()); 
		parametros.put("RFC", 				factura.getRfc());
		parametros.put("FECHA", 			factura.getFecha());
				
		 
		if(factura.isDesglosarIva()){
			
		}else{
			parametros.put("IMPORTE", 			factura.getTotal());
			parametros.put("IMPUESTO", 			BigDecimal.ZERO); 
			parametros.put("TOTAL", 			factura.getTotal());
		}
		
		parametros.put("DIRECCION", 		factura.getDireccionFiscal().formattedAddress());
		//Datos tomado de la aplicacion
		parametros.put("IMP_CON_LETRA", 	ImporteALetra.aLetra(CantidadMonetaria.pesos(factura.getTotal())));
		parametros.put("SUCURSAL", 			factura.getSucursal().getId()); 		
		parametros.put("CLAVCTE", 			factura.getCliente().getClave()); 		
		parametros.put("SUC", 				factura.getSucursal().getClave()); 
		parametros.put("TEL", 				factura.getCliente().getTelefonosRow());
		parametros.put("TIPO", 				factura.getTipo());
		parametros.put("DOCTO", 			Long.valueOf(factura.getFolio()));
		

		
		if(factura.getCliente().getClave().equals("1")
				|| factura.getRfc()==null
				|| factura.getRfc().equals("XAXX010101000")){
			
			//parametros.put("IMPORTE_BRUTO", factor.multiply(factura.getImporteBruto()).amount());
			parametros.put("IMPORTE_BRUTO", factura.getImporteBruto());
			//parametros.put("DESCUENTOS", 	factor.multiply(factura.getImporteDescuento()).amount());
			parametros.put("DESCUENTOS", 	factura.getImporteDescuento());
			parametros.put("IMPORTE", 		factura.getTotal());
			parametros.put("IMPUESTO", 		BigDecimal.ZERO);
		
		}else{
			parametros.put("IMPORTE_BRUTO", factura.getImporteBrutoSinIVA());
			parametros.put("DESCUENTOS", 	factura.getImporteDescuentoSinIva());			
			parametros.put("IMPORTE", 		factura.getImporte());
			parametros.put("IMPUESTO", 			factura.getImpuesto());
		}
		if(factura.getTipo().equals(VentasManager.TIPO_VENTA_GENERAL_DIARIA)){
			parametros.put("IMPORTE_BRUTO", factura.getImporteBrutoSinIVA());
			parametros.put("DESCUENTOS", 	factura.getImporteDescuentoSinIva());			
			parametros.put("IMPORTE", 		factura.getImporte());
			parametros.put("IMPUESTO", 			factura.getImpuesto());
		}
		parametros.put("TOTAL", 			factura.getTotal());
		parametros.put("PINT_IVA",			MonedasUtils.IVA.multiply(BigDecimal.valueOf(100)));
		parametros.put("FOLIOS_ASIGNADOS", 	factura.getFoliosAsignados());
		return parametros;
	}
	
	
	public static void imprimirPDF(Long facturaId){
		Factura factura=Services.getInstance().getVentasManager().getFactura(facturaId);
		ComprobanteFiscal cfdi=Services.getInstance().getCFDManager().cargarComprobante(factura);
		File res=Services.getInstance().getCFDIPrintServices().generarPDF(cfdi);
		MessageUtils.showMessage("CFDI impreso en: "+res.getPath(), "CFDI en PDF");
	}
	
	/**
	 * Prueba local en el EDT
	 * 
	 * @param args
	 * 
	 */
	public static void main(String[] args) {
		javax.swing.SwingUtilities.invokeLater(new Runnable() {

			public void run() {
				com.luxsoft.siipap.swing.utils.SWExtUIManager.setup();
				//imprimirFactura(57l, true);
				imprimirPDF(4044L);
				/*
				try {
					Runtime.getRuntime().exec("cmd /c start TimbrarXML.bat ");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				*/
				
				//ComprobanteFiscal cfdi=Services.getInstance().getCFDManager().cargarComprobante(factura);
				//CFDIValidaciones.validarDocumento(cfdi);
				System.exit(0);
			}

		});
	}
	
	 

}
